//
//  TabBarCtrlUtils.h
//  OCStarterProject
//
//  Created by huaya on 2025/10/2.
//

#import <UIKit/UIKit.h>
#import "TabBarController.h"
#import "NavigationController.h"
#import "BaseViewController.h"

NS_ASSUME_NONNULL_BEGIN

@interface TabBarCtrlUtils : NSObject
@property (nonatomic, strong) TabBarController *rootTabbarController;
SINGLETON_INTERFACE


#pragma mark - TabBar 相关方法

/// 获取当前显示的 TabBarController
+ (nullable TabBarController *)currentTabBarController;

/// 获取当前选中的 NavigationController
+ (nullable NavigationController *)currentNavigationController;

/// 获取当前显示的 ViewController
+ (nullable UIViewController *)currentViewController;

/// 切换到指定的 TabBar 索引
/// @param index TabBar 索引
+ (void)switchToTabAtIndex:(NSUInteger)index;

/// 获取当前选中的 TabBar 索引
+ (NSUInteger)currentSelectedTabIndex;

#pragma mark - Navigation 相关方法

/// 在当前导航栈中 Push 新的 ViewController
/// @param viewController 要 Push 的 ViewController
+ (void)pushViewController:(UIViewController *)viewController;

/// 在当前导航栈中 Push 新的 ViewController，并设置是否隐藏底部栏
/// @param viewController 要 Push 的 ViewController
/// @param hidesBottomBarWhenPushed 是否隐藏底部栏
+ (void)pushViewController:(UIViewController *)viewController hidesBottomBarWhenPushed:(BOOL)hidesBottomBarWhenPushed;

/// 在当前导航栈中 Push 新的 ViewController，并设置动画
/// @param viewController 要 Push 的 ViewController
/// @param animated 是否动画
+ (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;

/// 弹出当前导航栈顶部的 ViewController
+ (void)popViewController;

/// 弹出到指定的 ViewController
/// @param viewController 要弹出的目标 ViewController
+ (void)popToViewController:(UIViewController *)viewController;

/// 弹出到根 ViewController
+ (void)popToRootViewController;

/// 弹出到指定的 ViewController 类型
/// @param viewControllerClass 要弹出的目标 ViewController 类型
+ (void)popToViewControllerOfClass:(Class)viewControllerClass;

/// 在当前导航栈中 Present 新的 ViewController
/// @param viewController 要 Present 的 ViewController
+ (void)presentViewController:(UIViewController *)viewController;

/// 在当前导航栈中 Present 新的 ViewController，并设置完成回调
/// @param viewController 要 Present 的 ViewController
/// @param completion 完成回调
+ (void)presentViewController:(UIViewController *)viewController completion:(nullable void(^)(void))completion;

/// 关闭当前 Present 的 ViewController
+ (void)dismissViewController;

/// 关闭当前 Present 的 ViewController，并设置完成回调
/// @param completion 完成回调
+ (void)dismissViewControllerWithCompletion:(nullable void(^)(void))completion;

#pragma mark - 导航栈操作

/// 获取当前导航栈中的所有 ViewController
+ (nullable NSArray<UIViewController *> *)currentNavigationStack;

/// 检查导航栈中是否包含指定类型的 ViewController
/// @param viewControllerClass 要检查的 ViewController 类型
+ (BOOL)containsViewControllerOfClass:(Class)viewControllerClass;

/// 获取导航栈中指定类型的 ViewController
/// @param viewControllerClass 要获取的 ViewController 类型
+ (nullable UIViewController *)viewControllerOfClass:(Class)viewControllerClass;

/// 移除导航栈中指定类型的 ViewController
/// @param viewControllerClass 要移除的 ViewController 类型
+ (void)removeViewControllerOfClass:(Class)viewControllerClass;

/// 替换导航栈中指定类型的 ViewController
/// @param oldViewControllerClass 要替换的 ViewController 类型
/// @param newViewController 新的 ViewController
+ (void)replaceViewControllerOfClass:(Class)oldViewControllerClass withViewController:(UIViewController *)newViewController;

#pragma mark - 状态栏和导航栏设置

/// 设置状态栏样式
/// @param style 状态栏样式
+ (void)setStatusBarStyle:(UIStatusBarStyle)style;

/// 设置导航栏隐藏状态
/// @param hidden 是否隐藏
/// @param animated 是否动画
+ (void)setNavigationBarHidden:(BOOL)hidden animated:(BOOL)animated;

/// 设置导航栏背景颜色
/// @param color 背景颜色
+ (void)setNavigationBarBackgroundColor:(UIColor *)color;

/// 设置导航栏标题颜色
/// @param color 标题颜色
+ (void)setNavigationBarTitleColor:(UIColor *)color;

/// 设置导航栏按钮颜色
/// @param color 按钮颜色
+ (void)setNavigationBarTintColor:(UIColor *)color;

#pragma mark - 工具方法

/// 显示提示信息
/// @param message 提示信息
+ (void)showToast:(NSString *)message;

/// 显示加载指示器
+ (void)showLoading;

/// 隐藏加载指示器
+ (void)hideLoading;

/// 显示确认对话框
/// @param title 标题
/// @param message 消息
/// @param confirmTitle 确认按钮标题
/// @param cancelTitle 取消按钮标题
/// @param confirmAction 确认回调
/// @param cancelAction 取消回调
+ (void)showConfirmAlertWithTitle:(nullable NSString *)title
                          message:(nullable NSString *)message
                     confirmTitle:(nullable NSString *)confirmTitle
                      cancelTitle:(nullable NSString *)cancelTitle
                    confirmAction:(nullable void(^)(void))confirmAction
                     cancelAction:(nullable void(^)(void))cancelAction;

@end

NS_ASSUME_NONNULL_END
